package com.wx.gof.pattern.structural.bridge;

/**
 * @ClassName Application
 * @Author wx
 * @Description
 * 定义:
 * 将抽象部分与他的具体实现部分分离，使他们都可以独立的变化，通过组合的方式建立两个类之间的联系，而不是继承
 * 解释:
 * 把抽象与实现进行解耦，把抽象的行为分离成一个独立的接口，将它们的强关联去掉通过组合改换成弱关联
 * 在本案例中，银行抽象能打开账户，如果账户类型分很多，你要定义多个打开不同类型的账户方法或者定义不同类型账户的子类银行，
 * 这个时候把打开账户抽出来成一个接口，下面有不同账户类型的实现，银行抽象只需要引用这个接口，根据传入的不同的实现，打开的账户
 * 类型就不一样
 * 适用场景:
 * 1.抽象和具体实现之间增加更多的灵活性
 * 2.一个类存在两个(或多个)独立变化的维度，这些维度都需要独立进行扩展
 * 3.不是希望使用继承，或因为多层基础导致类的个数剧增
 * 优点:
 * 1.分离抽象部分与具体实现部分
 * 2.提高系统可扩展性
 * 缺点:
 * 1.增加了系统的理解与设计难度
 * 2.需要正确的识别出系统中多个独立变化的维度
 * 理解:
 * 应用程序-桥接设计模式(适合开闭原则，强调的是组合，而不是继承，把抽象与接口实现分离，
 * 使得抽象与实现都可以独立扩展，相互不影响)
 * @Date 2018-12-10-21:34
 */
public class Application {
    public static void main(String[] agrs){
        Bank constructionBank = new ConstructionBank();
        constructionBank.setAccount(new SavingAccount());
        Account account = constructionBank.openAccount();
        account.showAccountType();
        constructionBank.setAccount(new DepositAccount());
        account = constructionBank.openAccount();
        account.showAccountType();
    }
}
